Урок 20 – Уровни

При создании новых уровней несколько различных способов сделать это. Например, создать сцену для каждого нового уровня. Но я планирую вносить лишь небольшие изменения в нашу сцену для новых уровней, поэтому создавать новые сцены не вижу смысла, мы лишь будет изменять нашу сцену.

Для этого нам необходимо создать глобальную переменную. До этого мы создавали переменные сцены, которые запоминались компьютером пока сцена не закончится или перезапустится. Глобальная же переменная будет запоминаться компьютером, пока мы не закроем игру. Наш метод будет заключаться в том, чтобы увеличивать глобальную переменную, с каждым запуском уровня, а вместе и с ней и вносить изменения в геймплей.

Давайте создадим глобальную переменную в группе переменные.

Первым делом мы сравним, равна ли наша глобальная переменная CurrentLevel нулю. Этим самым мы сделаем сразу два действия – у нас создаться глобальная переменная с именем CurrentLevel (по умолчанию она будет равна 0), и мы сразу создадим условие “Если наша переменная равна 0”, то в действии присваиваем ей значение 1 (так как у нас 1-ый уровень).

Далее создаем еще одно условие – “Если глобальная переменная равна 1”, то в действии создаем препятствия и удаляем половину блоков.

Давайте теперь создадим действия для второго уровня. Для этого скопируем условие и действия для первого уровня, только в условии укажем “Если глобальная переменная равна 2”.

Создание блоков оставим на месте на уровне 2, а вместо удаление 50% блоков мы их будем вращать. Выбираем наши объекты Obstacle и задаем им всем случайное вращение.

Т.е. мы выбираем наши объекты Obstacle, далее выбираем действие Angle (т.е. угол), а в параметре угла выбираем RandomWithStep, где первый и второй параметр – это начальное и конечное значение угла, а третий параметр – это шаг. У нас шаг равен 45 градусов. Получается случайный угол может быть только 45, 90, 135 и т.д. градусов.

И я еще допустил ошибку – я забыл все эти условия и действия сделать под условиями и действиями At the beginning of the scene.

И как видите, я задал изначальное значение 2 для CurrentLevel. Теперь если мы запустим игру, то у нас сразу же загрузится второй уровень.

Теперь я хочу слегка разбросать эти блоки по Y от их начального значения.

Т.е. мы к их начальному значению по оси Y, прибавляем от 0 до 500 пикселей.

Далее я хочу расположить объекты преград выше остальных с помощью Z-index и также уменьшить количество создаваемых преград, чтобы они не залазили на слово START.

Теперь мы должны сделать переключение с первого уровня на второй и т.д., когда игрок пересекает финишную черту.

Создаем новую группу событий “Change Level”.

В условии запишем – когда наш объект пересекает финишную черту.

А в действии прибавим к нашей глобальной переменой число 1.

И далее перезагрузим нашу сцену.

Затем снова меняем начальное значение глобальной переменной на 1 и проверяем игру – пытаемся дойти до финальной линии и посмотреть, перейдет ли игра на уровень 2. У меня все заработало, и у вас должно все также хорошо работать.

Для третьего уровня я хочу создать движущиеся блоки. Копируем наш объект Obstacle, и называем новый объект как MovingObstacle.

Далее я хочу изменить цвет этого объекта, но просто изменить исходную картинку я не могу, так как на этот файл ссылается и объект Obstacle.

Чтобы обойти это препятствие, мы просто добавим анимацию и отредактируем ее с помощью Piskel.

Создам точно такой же спрайт, только синего цвета, и удалю предыдущий.

В итоге этот объект будет выглядеть так.

Однако этот объект пока не двигается. Заставить его двигаться очень легко, перейдите в раздел Behaviours (поведение) у этого объекта и в поиске наберите Rectangular movement.

После установки этого поведения, устанавливаем его на объект.

По умолчанию указаны такие значения. Давайте посмотрим что произойдет с объектом в игре.

Как видите, объект двигается по часовой стрелке с разной скоростью: быстро двигается по вертикали и медленно по горизонтали.

Давайте теперь изменим значения для нашего поведения.

Начальную точку оставляем какой есть – это левый верхний угол. В настройках расстояния ставим высоту на 0, а ширину на 650 (это примерная ширина дороги, по которой и будет двигаться объект). Оставляем галочку, чтобы объект двигался по часовой стрелке. В пункте easing, т.е. ослабление или замедление, оставляем easeInOutSine, т.е. объект будет замедляться достигая какого-либо угла нашего прямоугольника (хотя в нашем случае траектория движения – это прямая). Продолжительность движения для горизонтальной оси ставим 1, чтобы объект двигался быстрее, а для вертикальной ставим 0, т.к. по вертикали наш объект двигаться не будет. Применяем.

Далее идем в события создавать третий уровень.

Т.е. мы скопировали предыдущий уровень и изменили число колонок и какие объекты будут появляться.

Проверяем. Как видим появились движущиеся препятствия, но они все двигаются с одинаковой скоростью. Давайте это изменим.

Добавим новое действие для нашего объекта.

Проверяем.

Давайте уменьшим расстояние между объектами и увеличим ширину строк.

Давайте теперь сделаем так, чтобы при соприкосновении игрока и движущегося объекта, объект останавливался.

Т.е. для начала мы скопировали событие, где игрок сталкивается с преградой, изменили преграду на движущиеся преграды. В действие звук оставим и добавим еще такое действие:

Данное действие деактивирует (или активирует) то поведение, которое мы выберем. Проверяем. Все должно работать.

Давайте еще добавим преграды на 3-ий уровень, который будут подсказывать нам с какой скоростью мы движемся..

Укажем, что нам необходимо 2 колонки, позицию применим Ground.X() – 128 пикселей, это как раз за пределами дороги, и расстояние между колонками укажем равной ширине дороги. Затем удалим два действия ниже – угол и позицию преград.

И последнее на этом уроке, я хочу показывать с помощью текста, на каком уровне мы находимся.

Для этого скопируем объект Time_TEXT и переименуем в CurrentLevel_TEXT.

Изменим заполнитель на Level 12 и расположим данный объект сюда.

Теперь введем событие в начале игры, которое должно сработать 1 раз.

Проверяем. Все должно заработать!))

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *